package com.gxzy.util.jdbc;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * @ClassName: JdbcTemplateUtil
 * @Deprecated: JDBCTemplate工具类
 * @Author: 胡隆河
 * @Date: 2020/3/21 9:48
 **/

@Component
public class JdbcTemplateUtil {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    private final Logger log = LogManager.getLogger(this.getClass());

    /**
     * 只查询一列数据类型对象。用于只有一行查询结果的数据
     *
     * @param sql
     * @param params
     * @param cla    Integer.class,Float.class,Double.Class,Long.class,Boolean.class,Char.class,Byte.class,Short.class
     * @return
     */
    public Object queryOneColumnForSigetonRow(String sql, Object[] params, Class cla) {
        Object result = null;
        try {
            if (params == null || params.length > 0) {
                assert params != null;
                result = jdbcTemplate.queryForObject(sql, params, cla);
            } else {
                result = jdbcTemplate.queryForObject(sql, cla);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return result;
    }

    /**
     * 查询返回List<Map<String,Object>>格式数据,每一个Map代表一行数据，列名为key
     *
     * @param sql    sql语句
     * @param params 填充问号占位符数
     * @return
     */
    public List<Map<String, Object>> queryForMaps(String sql, Object[] params) {
        try {
            if (params != null && params.length > 0) {
                return jdbcTemplate.queryForList(sql, params);
            }
            return jdbcTemplate.queryForList(sql);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * 查询分页（MySQL数据库）
     *
     * @param sql    终执行查询的语句
     * @param params 填充sql语句中的问号占位符数
     * @param page   想要第几页的数据
     * @param size   每页显示多少条数
     * @param cla    要封装成的实体元类型
     * @return pageList对象
     */
    public <T> PageList queryByPageForMySQL(String sql, Object[] params, long page, long size, Class<T> cla) {
        String rowsql = "select count(*) from (" + sql + ") tb";   //查询总行数sql
        int pages = 0;   //总页数
        long rows = (Long) queryOneColumnForSigetonRow(rowsql, params, Long.class);  //查询总行数

        //查询第page页的数据sql语句
        if (page <= 1) {
            sql += " limit 0," + size;
        } else {
            sql += " limit " + page + "," + size;
        }
        log.info("ex SQL -> " + sql);

        List list = null;
        if (cla != null) {
            list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(cla));
        } else {
            list = queryForMaps(sql, params);
        }

        //返回分页格式数据
        PageList pl = new PageList();
        pl.setPage(page);  //设置显示的当前页数
        pl.setPages(pages);  //设置总页数
        pl.setList(list);   //设置当前页数据
        pl.setTotalRows(rows);    //设置总记录数
        return pl;
    }

    /**
     * 查询返回List对象
     *
     * @param sql    需要执行的SQl
     * @param params 携带的参数
     * @param cla    返回映射实体类类型
     * @return
     */
    public <T> List<T> queryForMySQL(String sql, Object[] params, Class<T> cla) {
        log.info("ex SQL -> " + sql);
        List<T> list = null;
        if (cla != null) {
            list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(cla));
        }
        return list;
    }

    /**
     * 更新
     *
     * @param sql
     * @return
     */
    public int update(String sql) {
        log.info("ex SQL -> " + sql);
        return jdbcTemplate.update(sql);
    }
}
